import {
	baseWSUrl
} from '@/src/utils/http.js'

export default class SoketHandle {
	static url = `${baseWSUrl}/message/ws?authorization=${uni.getStorageSync('token')?.access_token}`;
	static reconnectInterval = 5000; // 5秒(超时时间)
	static maxReconnectAttempts = 5; // 最大重连次数

	constructor() {
		this.socket = null;
		this.reconnectTimeout = null; // 定时器
		this.reconnectAttempts = 0; //当前重连次数
	}

	/**
	 * 参数为钩子函数
	 */
	connect({
		onopen,
		onmessage,
		onclose
	}) {
		if (this.socket) {
			// 如果已经有一个 WebSocket 实例，则先关闭它
			this.socket.close({
				code: 1000,
				reason: '手动关闭 WebSocket...'
			});
			this.socket = null;
		}

		this.socket = uni.connectSocket({
			url: SoketHandle.url,
			success() {
				console.log("Socket API Success");
			},
			fail() {
				console.log("Socket API failed");
				uni.showToast({
					title: 'Socket API failed',
					icon: 'error',
					duration: 1500,
				})
				this.socket = null
			}
		});

		this.socket.onOpen((event) => {
			console.log('WebSocket 已连接', event);
			this.reconnectAttempts = 0; // 重置重连次数
			// 在这里可以发送数据或执行其他操作
			onopen(event)
		})

		this.socket.onMessage((event) => {
			try {
				const data = JSON.parse(event.data)
				console.log('Received message:', data);
				// 处理接收到的数据
				onmessage(data)
			} catch (error) {
				//TODO handle the exception
				console.log('Received message:', event.data);
			}
		})

		this.socket.onClose((event) => {
			console.log('WebSocket 连接被关闭，Code:', event.code, 'Reason:', event.reason);

			if (this.reconnectTimeout) {
				clearTimeout(this.reconnectTimeout);
				this.reconnectTimeout = null;
			}

			onclose(event)

			if (event.code == 1000) {
				this.socket = null
				// 主动关闭不重连
				return
			}

			uni.showToast({
				title: '服务台已离线',
				icon: 'none'
			})

			if (event.code == 1002) {
				this.socket = null
				uni.showToast({
					title: '服务台连接被拒绝',
					icon: 'none'
				})
				console.error('WebSocket error:', 'WebSocket 连接被拒绝');
				return
			}

			if (this.reconnectAttempts < SoketHandle.maxReconnectAttempts) {
				this.reconnectAttempts++;
				console.log(`WebSocket 重连中 ${this.reconnectAttempts}...`);
				// 设置一个超时来尝试重新连接
				this.reconnectTimeout = setTimeout(() => {
					this.connect({
						onopen,
						onmessage,
						onclose
					})
				}, SoketHandle.reconnectInterval);
			} else {
				this.socket = null
				console.log('WebSocket 超过最大重连次数，已关闭重连。');
			}
		})

		this.socket.onError((error) => {
			console.error('WebSocket error:', error);
			// 处理错误，可以根据需要关闭并重新连接
			this.socket.close({
				code: '-1',
				reason: error
			});
			// 如果需要，可以在这里立即尝试重新连接，而不是等待 onclose 事件
			// this.connect(); // 注意：这可能会导致在短时间内多次尝试连接
		})
	}

	// 手动关闭 WebSocket 的函数
	// 手动关闭不会重连
	closeSocket() {
		if (this.socket) {
			this.socket.close({
				code: 1000,
				reason: '手动关闭 WebSocket...',
			});
			this.socket = null;
			// 如果有一个正在进行的重新连接超时，可以清除它
			// if (this.reconnectTimeout) {
			// 	clearTimeout(this.reconnectTimeout);
			// 	this.reconnectTimeout = null;
			// }
		}
	}

	// 发送消息
	sendMsg(message) {
		if (this.socket) {
			this.socket.send({
				data: JSON.stringify(message)
			});
		}
	}
}